package codec

import "io"

type Header struct {
	// 服务名和方法名  一般和Go语言中的结构体和方法相映射
	ServiceMethod string // format "Service.Method"
	// seq 是请求的序号，也可以认为是某个请求的ID,用来区分不同的请求
	Seq uint64 //sequence  number
	// Error是错误信息，客户端置为空，服务端如果发生错误，将错误信息置于Error中
	Error string
}

// 抽象出对消息进行编解码的接口Codec，抽象出接口是为了实现不同的Codec实例

type Codec interface {
	io.Closer
	ReadHeader(*Header) error
	ReadBody(interface{}) error
	Write(*Header, interface{}) error
}

// 抽象出Codec的构造函数，客户端和服务端可以通过Codec的Type得到构造函数，从而创建Codec实例

type NewCodecFunc func(closer io.ReadWriteCloser) Codec

type Type string

const (
	GobType  Type = "application/gob"
	JsonType Type = "application/json"
)

var NewCodecFuncMap map[Type]NewCodecFunc

func init() {
	NewCodecFuncMap = make(map[Type]NewCodecFunc)
	NewCodecFuncMap[GobType] = NewGobCodec
}
